package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.Cliente;
import com.app.sgd.model.bean.EmpleadoCliente;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class SQLClienteDAO {
	private static Logger logger = Logger.getLogger(SQLClienteDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
	public ArrayList filtrarClientes(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstClientes = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_busqueda_clientes(?,?,?)}";
	    	call = conn.prepareCall(vSQL);
            call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodTipoCliente()));
            call.setString(2,filtroBusquedaVO.getDescCliente());
            call.setString(3,filtroBusquedaVO.getCodEstado());
            
//            logger.info("SQL = " + vSQL + "("+filtroBusquedaVO.getCodTipoCliente()+","+filtroBusquedaVO.getDescCliente()+")");
            logger.info("inicio std_sp_busqueda_clientes:" + new Date());
            
            rs = call.executeQuery();
            logger.info("fin std_sp_busqueda_clientes: " + new Date());
            int ind=0;
            while(rs.next()){
            	Cliente cliente = new Cliente();
            	cliente.setIndice (String.valueOf(ind++));
            	cliente.setCodigoCliente   (rs.getString("codigoCliente"));
            	cliente.setRazonSocial     (rs.getString("razonSocial"));
            	cliente.setDireccion       (rs.getString("direccion"));
            	cliente.setCodTipoCliente  (rs.getString("codTipoCliente"));
            	cliente.setDescTipoCliente (rs.getString("descTipoCliente"));
            	cliente.setCodEmplCliente  (rs.getString("codEmplCliente"));
            	cliente.setDescEmplCliente (rs.getString("descEmplCliente"));
            	cliente.setApeEmplCliente  (rs.getString("apeEmplCliente"));
            	cliente.setCargoEmplCliente(rs.getString("cargoEmplCliente"));

            	cliente.setCodTipoRubro(rs.getString("codTipoRubro"));
            	cliente.setCodAmbito(rs.getString("codAmbito"));
            	cliente.setCodTipo(rs.getString("codTipoPersona"));
            	cliente.setCodDpto(rs.getString("codDpto"));
            	cliente.setCodPais(rs.getString("codPais"));
            	cliente.setCodProv(rs.getString("codProv"));
            	cliente.setCodDist(rs.getString("codDist"));
            	cliente.setNumRuc(rs.getString("numRuc"));
            	cliente.setNombreRepresentante(rs.getString("nombreRepresentante"));
            	cliente.setNumTelefono(rs.getString("numTelefono"));
            	cliente.setCodEstado(rs.getString("codEstado"));
            	cliente.setEmail(rs.getString("email"));
            	cliente.setNumDoc(rs.getString("numDoc"));
            	cliente.setCodTipDoc(rs.getString("codTipDoc"));
            	cliente.setNombre(rs.getString("nombreCorto"));
            	cliente.setCodEPS(rs.getString("codEPS"));
            	cliente.setCodEstadoEmp(rs.getString("codEstadoEmp"));
            	cliente.setDescEstadoEmp(rs.getString("descEstadoEmp"));
            	lstClientes.add(cliente);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en filtrarClientes: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstClientes;
	}
	
	public String actualizarCliente(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		String codCliente = "0";
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_upd_datos_cliente(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
            call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCliente().getCodigoCliente()));
            call.setString(2,filtroBusquedaVO.getCliente().getRazonSocial());
            call.setString(3,filtroBusquedaVO.getCliente().getCodAmbito());
            call.setString(4,null);
            call.setString(5,filtroBusquedaVO.getCliente().getCodTipo()); //tipo de persona
            call.setString(6,filtroBusquedaVO.getCliente().getDireccion());
            call.setString(7,filtroBusquedaVO.getCliente().getCodTipoCliente());
            call.setInt(8,Integer.parseInt(filtroBusquedaVO.getCliente().getCodDpto()));
            call.setInt(9,Integer.parseInt(filtroBusquedaVO.getCliente().getCodPais()));
            call.setInt(10,Integer.parseInt(filtroBusquedaVO.getCliente().getCodProv()));
            call.setInt(11,Integer.parseInt(filtroBusquedaVO.getCliente().getCodDist()));
            call.setString(12,filtroBusquedaVO.getCliente().getNumRuc());
            call.setString(13,filtroBusquedaVO.getCliente().getNombreRepresentante());
            call.setString(14,filtroBusquedaVO.getCliente().getNumTelefono());
            call.setString(15,filtroBusquedaVO.getCliente().getCodTipoRubro());
            call.setString(16,filtroBusquedaVO.getCliente().getCodEstado());
            call.setString(17,filtroBusquedaVO.getCliente().getEmail());
            call.setString(18,filtroBusquedaVO.getCliente().getNumDoc());
            call.setString(19,filtroBusquedaVO.getCliente().getCodTipDoc());
            call.setString(20,filtroBusquedaVO.getCliente().getNombre());
            call.setString(21,filtroBusquedaVO.getCliente().getCodEPS());
            call.setString(22,filtroBusquedaVO.getCliente().getCodDist());
            call.setString(23,filtroBusquedaVO.getCliente().getCodProv());
            call.registerOutParameter(24,Types.VARCHAR);
//            logger.info("inicio std_sp_busqueda_clientes:" + new Date());
            call.executeUpdate();
            codCliente = call.getString(24);
//            logger.info("fin std_sp_busqueda_clientes: " + new Date());
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarCliente: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return codCliente;
	}
	
	public ArrayList listarEmpleadosCliente(String codCliente) throws Exception {
		ArrayList lstEmpleadosCliente = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_empleados_cliente(?)}";
	    	call = conn.prepareCall(vSQL);
            call.setInt(1,Integer.parseInt(codCliente));
            
            rs = call.executeQuery();
            int ind=0;
            while(rs.next()){
            	EmpleadoCliente empleadoCliente = new EmpleadoCliente();
            	empleadoCliente.setIndiceEmpCli(String.valueOf(ind++));
            	empleadoCliente.setCodigoEmpCli(rs.getString("CODI_EMP_CLI"));
            	empleadoCliente.setNombreEmpCli(rs.getString("DESC_EMP_CLI"));
            	empleadoCliente.setApellidoEmpCli(rs.getString("APE_EMP_CLI"));
            	empleadoCliente.setCargoEmpCli(rs.getString("CARG_EMP_CLI"));
            	empleadoCliente.setTipoDocEmpCli(rs.getString("DOCU_EMP_CLI").equals(Constants.VALOR_DEFAULT_VACIO) ? Constants.VALOR_DEFAULT_CERO : rs.getString("DOCU_EMP_CLI"));
            	empleadoCliente.setNumDocEmpCli(rs.getString("NUMD_EMPL_CLI"));
            	empleadoCliente.setCodEstadoEmpCli(rs.getString("ESTA_EMP_CLI"));
            	empleadoCliente.setDescTipoDocEmpCli(rs.getString("DESC_DOC_IDEN"));
            	empleadoCliente.setDescEstadoEmp(rs.getString("descEstadoEmp"));

            	lstEmpleadosCliente.add(empleadoCliente);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarEmpleadosCliente: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstEmpleadosCliente;
	}
	
	public int registrarEmpleadoCliente(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_grabar_empleados_cliente(?,?,?,?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
            call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodCliente()));
            call.setInt(2,Integer.parseInt(filtroBusquedaVO.getEmpleadoCliente().getCodigoEmpCli()));
            call.setString(3,filtroBusquedaVO.getEmpleadoCliente().getNombreEmpCli());
            call.setString(4,filtroBusquedaVO.getEmpleadoCliente().getCargoEmpCli());
            call.setString(5,filtroBusquedaVO.getEmpleadoCliente().getTipoDocEmpCli());
            call.setString(6,filtroBusquedaVO.getEmpleadoCliente().getApellidoEmpCli());
            call.setString(7,filtroBusquedaVO.getEmpleadoCliente().getNumDocEmpCli());
            call.setString(8,filtroBusquedaVO.getEmpleadoCliente().getCodEstadoEmpCli());
//            logger.info("inicio std_sp_busqueda_clientes:" + new Date());
            call.executeUpdate();
//            logger.info("fin std_sp_busqueda_clientes: " + new Date());
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarCliente: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
}
